popover: Create subsurface on wayland
authorTimm Bäder <mail@baedert.org>
Wed, 21 Jun 2017 11:25:41 +0000 (13:25 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 20 Jul 2017 01:27:14 +0000 (21:27 -0400)
gtk/gtkpopover.c

index 2ae6f7a1f142d4009a2469a7ec480e9285e1cdaf..05cbacb346a5b0c9144b80b0b8cb604e8303dd32 100644 (file)
@@ -378,11 +378,30 @@ gtk_popover_realize (GtkWidget *widget)
   GtkAllocation allocation;
   GdkWindow *window;
 
-  gtk_widget_get_allocation (widget, &allocation);
+  gtk_widget_get_window_allocation (widget, &allocation);
+
+#ifdef GDK_WINDOWING_WAYLAND
+  if (GDK_IS_WAYLAND_DISPLAY (gtk_widget_get_display (widget)))
+    {
+      GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
+
+      g_assert (GTK_IS_WINDOW (toplevel));
+
+      window = gdk_wayland_window_new_subsurface (gtk_widget_get_display (toplevel),
+                                                  GDK_ALL_EVENTS_MASK,
+                                                  &allocation);
+
+      gdk_window_set_transient_for (window,
+                                    gtk_widget_get_window (toplevel));
+    }
+  else
+#endif
+    {
+      window = gdk_window_new_child (gtk_widget_get_parent_window (widget),
+                                     GDK_ALL_EVENTS_MASK,
+                                     &allocation);
+    }
 
-  window = gdk_window_new_child (gtk_widget_get_parent_window (widget),
-                                 GDK_ALL_EVENTS_MASK,
-                                 &(GdkRectangle) { 0, 0, allocation.width, allocation.height });
   gtk_widget_set_window (widget, window);
   gtk_widget_register_window (widget, window);
   gtk_widget_set_realized (widget, TRUE);